
"""
声音池例子的UI层。
"""
import asyncio
import typing
from elio import core

# 如果要播放服务端的本地音效，需要注册一个用于分发静态文件的服务。
# 第一个参数如果是空字符串则用当前目录（当前目录中有test.wav），如果test.wav文件在xxx目录中，那参数就需要写'xxx'；
# 第二个参数是路由名称，在url中表示为`http://localhost:8001/路由名称`
localBaseUrl = core.static_file_serve('', '/static')


# 如果路由名称为/static，则使用test.wav资源的完整url是:http://localhost:8001/static/test.wav（localBaseUrl + '/test.wav'）
class SoundPoolLayer(core.AutoRecycleLayer[core.Activity]):
    """
    演示声音池的UI类。
    """
    pool: core.SoundPool

    async def on_create(self, *args: typing.Any, **kwargs: typing.Dict):
        await super().on_create(*args, *kwargs)

    async def on_hide(self):
        await super().on_hide()
        # 销毁声音池
        await self.pool.destroy()

    async def on_show(self):
        await super().on_show()
        activity = self.parent
        await activity.accessibility_notice('正在加载声音资源')
        # 创建声音池，最多可同时播放5个音效
        self.pool = await core.SoundPool.create(activity, 5)
        # 可以从任何网站加载
        load_result = await self.pool.load('http://downsc.chinaz.net', '/Files/DownLoad/sound1/202004/12732.mp3',
                                           '/Files/DownLoad/sound1/202011/13629.mp3')
        # 也可以从本地加载
        load_result2 = await self.pool.load(localBaseUrl, '/test.wav')
        print('音效预加载状态', load_result, load_result2)
        await asyncio.sleep(1)
        await activity.accessibility_notice('加载声音资源完毕')
        # 播放从其他站点加载的音效
        play_id = await self.pool.play('/Files/DownLoad/sound1/202004/12732.mp3')
        await asyncio.sleep(1)
        play_id2 = await self.pool.play('/Files/DownLoad/sound1/202011/13629.mp3')
        await asyncio.sleep(1)
        # 播放从本地加载的音效
        play_id3 = await self.pool.play('/test.wav')
        # 只要声音池对象不销毁，多次调用play函数都会从池中找出空闲的播放器进行播放，池大小是5，意味着可以同时且不打断的状态下播放5个声音
        # 从本地播放需要使用staticFileServe函数注册，他返回一个baseUrl，把baseUrl可以直接传入load函数
        print('播放ID', play_id, play_id2, play_id3)

    async def on_pause(self):
        await super().on_pause()

    async def on_resume(self):
        await super().on_resume()

    async def on_destroy(self, *args: typing.Any, **kwargs: typing.Dict):
        await super().on_destroy(*args, **kwargs)
